Soru & Cevap

Conway's Game of Life

24.06.2014 - 12:31

Merhaba Arkadaslar. 

Ben Conway's Game of Life adli bir oyunu Java ile eclipse de yazmaya calisiyorum. Bilmeyenler icin kurallari su sekilde : 

Hayat oyununun evreni sonsuz iki boyutlu dikey ızgaraların kare hücreleridir. Hücreler iki durumda olabilir: ölü (0) ya da diri(1). Her hücre yatay, dikey veya çapraz omak üzere bitişik olan sekiz komşusuyla doğrudan etkileşir. Herhangi bir hücre için, her zaman adımında aşağıdaki değişikliklerden biri gerçekleşir: 

Bir canlı hücrenin, iki'den daha az canlı komşusu varsa "yalnızlık nedeniyle" ölür 
Bir canlı hücrenin, üç'ten daha fazla canlı komşusu varsa "kalabalıklaşma nedeniyle" ölür 
Bir canlı hücrenin, iki ya da üç canlı komşusu varsa değişmeden bir sonraki nesile kalır 
Bir ölü hücrenin tam olarak üç canlı komşusu varsa canlanır. 

Olu elemanlar 0 , canlilar 1 ile tanimlanmistir. Program animasyon seklinde calisacaktir ve ben Cerceveyi kapatana kadar dongude kalacaktir. Fakat programda sorun yasiyorum animasyon yapmiyor. Ekte programin ekrana cizdigi animasyonsuz olan hali gorebilirsiniz. Yardimci olabilecek olan var mi acaba ??? 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.Transient;
import java.util.Random;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class ConwaysGameOfLife extends JPanel {

    private int[][] grid;
    private static final Random rnd = new Random();

    public ConwaysGameOfLife(int width, int height) {
        this.grid = new int[width][height];
        setupGrid();
    }

    private void setupGrid() {
        for (int[] row : grid) {
            for (int j = 0; j < row.length; j++) {
                if (rnd.nextDouble() < 0.92)
                    continue;
                row[j] = rnd.nextInt(2);
            }
        }
    }

    public void updateGrid() {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                countAndDecideDeadOrAlive(i, j);
            }
        }
    }

    private void countAndDecideDeadOrAlive(int rowIndex, int columnIndex) {
        int counter = 0;

        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {

                counter = 0;

                if ((i > 0 && j > 0) && grid[i - 1][j - 1] == '1')
                    counter++;
                if (i > 0 && grid[i - 1][j] == 1)
                    counter++;
                if ((i > 0 && j < grid[i].length - 1)
                        && grid[i - 1][j + 1] == 1)
                    counter++;
                if (j > 0 && grid[i][j - 1] == 1)
                    counter++;
                if (j < grid[i].length - 1 && grid[i][j + 1] == 1)
                    counter++;
                if ((j > 0 && i < grid.length - 1) && grid[i + 1][j - 1] == 1)
                    counter++;
                if (i < grid.length - 1 && grid[i + 1][j] == 1)
                    counter++;
                if ((i < grid.length - 1 && j < grid[i].length - 1)
                        && grid[i + 1][j + 1] == 1)
                    counter++;

                if (grid[i][j] == 1) {

                    if (counter > 3 || counter < 2)
                        grid[i][j] = 0;

                } else {
                    if (counter == 3)
                        grid[i][j] = 1;
                }

            }
        }
    }

    public Dimension getPreferredSize() {
        return new Dimension(grid.length * 4, grid[0].length * 4);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Color gColor = g.getColor();

        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 1) {
                    g.setColor(Color.black);
                    g.fillRect(j * 10, i * 10, 10, 10);
                }
                else{
                    g.drawRect(j * 10, i * 10, 10, 10);
                }
            }
        }

        g.setColor(gColor);
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Bir row giriniz");

        final int row = input.nextInt();
        System.out.println("Bir column giriniz");

        final int column = input.nextInt();
        
        final ConwaysGameOfLife c = new ConwaysGameOfLife(row, column);
        
        JFrame frame = new JFrame();
        frame.getContentPane().add(c);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        ActionListener al = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                c.updateGrid();

                c.repaint();
            }
        };

        Timer timer = new Timer(1000, al);
        timer.start();
        timer.stop();
    }
}

 

11 Görüntülenme

0 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.